巨人与鬼(分治&&递归)

此题有原文:https://blog.csdn.net/qq_36459536/article/details/78366488

做这一题学会了 atan2 的用法。

a(x1,y1)              b(x2,y2)

向量a=>b = (y2 - y1)/ (x2 - x1)

与x轴正半轴的夹角为  atan2( y2 - y1,x2 - x1)。。。。。

 

我写这篇博客只为记录我的代码:

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 100000;

struct point {
	int x, y, flag, num;
} p[maxn], temp;
int ans[maxn], n;
bool cmp1(point a, point b) {
	return a.y !=b.y ? a.y < b.y : a.x < b.x;
}
bool cmp2(point a, point b) {
	return atan2(a.y - temp.y, a.x -temp.x ) < atan2(b.y - temp.y, b.x - temp.x);
}
void findx(int left, int right) {
	if(left > right ) return ;
	sort(p+left, p+right+1, cmp1);  // 找到左下角的点
	temp = p[left];
	sort(p+left, p+right+1, cmp2); //从 某一边的弧度开始找。。。
	int cnt1 = 0, cnt2 = 0, k = right;  //万一就是这个点呢?
	while(!(temp.flag != p[k].flag&&cnt1 == cnt2)) { //如果点相同直接停止,如果不同直到找到 相同的 cnt1 和 cnt2
		if(temp.flag == p[k].flag) cnt1++; //  相同的加
		else cnt2++;  //不相同的加
		k--;
	}
	ans[temp.num] = p[k].num;
	ans[p[k].num] = temp.num;
	findx(left + 1, k - 1);
	findx(k + 1, right);
}
int main() {
	cin >> n;
	for(int i = 1; i <= n; ++i) cin >> p[i].x >> p[i].y >> p[i].flag, p[i].num = i;
	findx(1,n);
	for(int i = 1; i <= n; i++) cout << i << " => " << ans[i] <<endl;
	return 0;
}
/*
4
1 1 1
2 3 1
3 2 0
7 9 0*/

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值